﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpStudy
{
    delegate void SayDelegate(string name);//定义一个委托
    class DelegateAndEvent
    {

        #region 简单入门   方法一：委托的使用
        //static void Main(string[] args)
        //{
        //    say("jake", SayHelloEn);//传入静态方法
        //    DelegateAndEvent p = new DelegateAndEvent();
        //    say("张", p.SayHelloCn);//传入实例方法
        //    Console.ReadLine();
        //}

        //private static void say(string name, SayDelegate funcName)//委托作为参数传递方法名称
        //{
        //    funcName(name);
        //}
        #endregion

        #region 方法二:使用中间类管理委托
        //static void Main(string[] test)
        //{
        //    SayManage manage = new SayManage();
        //    manage.delegate1 = SayHelloEn;
        //    manage.Say("jake");
        //    SayManage manage1 = new SayManage();
        //    manage1.Say("ss");
        //    Console.ReadLine();
        //}

        #endregion

        #region 方法三：使用事件委托

        //public static void Main(string[] args)
        //{
        //    SayManage manage = new SayManage();
        //    //manage.delegate1 = SayHelloEn; //由于使用了事件委托，事件内部已经将变量delegate1定义为 private，所以不能直接赋值，只能+=   -=
        //    manage.delegate1 += SayHelloEn;
        //    manage.Say("jenny");
        //    Console.ReadLine();
        //}

        #endregion
        private void SayHelloCn(string name)
        {
            Console.WriteLine("你好 :" + name);
        }
        private static void SayHelloEn(string name)
        {
            Console.WriteLine("Hello :" + name);
        }

    }

    class SayManage
    {
        //public SayDelegate delegate1; //委托   方法二独用
        public event SayDelegate delegate1;//事件委托   方法三独用
        public void Say(string name)
        {
            if (delegate1 != null)
            {
                delegate1(name);
            }
            else
            {
                Console.WriteLine("为传入方法");
            }
        }
    }
}
